package org.jeecg.modules.common.baseservice;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.IService;


import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface IBaseBatchService<T>  {
    /**
     * 根据ids和一个对象，批量更新复制属性给ids对应的数据
     * @param ids
     * @param entityObj
     * @return
     */
    UpdateWrapper batchCopyUpdateByArray(Object[] ids, T entityObj );
    /**
     * 根据ids和一个对象，批量更新复制属性给ids对应的数据
     * @param ids
     * @param entityObj
     * @return
     */
    UpdateWrapper batchCopyUpdateByList(List ids, T entityObj ) ;


    /**
     * 按对象属性有无值动态获得查询sql。即对象属性有值的列被查询。过滤对象属性有值则加入过滤条件
     * @param queryWrapper
     * @param selectEntityObj select查询跳进，，属性有值则查询显示，属性无值则忽略
     * @param whereEntityObj  where过滤条件对象，属性有值则过滤，属性无值则忽略
     * @return
     */
    public QueryWrapper<T> getQuerySqlByObj(QueryWrapper<T> queryWrapper, T selectEntityObj, T whereEntityObj);
    /**
     * 动态获取查询sql，指定返回数据属性列名称，where过滤条件map
     * @param queryWrapper
     * @param entityClazz 对象类名
     * @param selectFields 指定返回数据属性列名称
     * @param whereCondition where过滤条件map
     * @return
     */
    QueryWrapper<T> getQuerySqlByMap(QueryWrapper<T> queryWrapper, Class entityClazz, Collection<String> selectFields, Map whereCondition);
    /**
     * 获取批量处理的sql语句,set对象属性有值部分会被set无值属性被忽略，wher过滤对象有值属性加入过滤条件
     * @param updateWrapper
     * @param setEntityObj  set条件对象，属性有值则set，属性无值则忽略
     * @param whereEntityObj where过滤条件，属性有值则加入过滤条件，属性无值则忽略
     * @return
     */
    UpdateWrapper getBatchSqlUpdateByObj(UpdateWrapper<T> updateWrapper, T setEntityObj , T whereEntityObj );

    /**
     *
     * @param updateWrapper
     * @param entityClazz
     * @param setFieldMap set设置属性列map
     * @param whereCondition where过滤体条件map
     * @return
     */
    UpdateWrapper getBatchSqlUpdateByMap(UpdateWrapper updateWrapper, Class entityClazz, Map setFieldMap, Map whereCondition);

    /**
     * 批量复制对象属性值给指定过滤条件的对象
     * @param whereCondition where过滤条件 筛选目标对象
     * @param entityObj 需要被复制的源对象
     * @return
     */
    UpdateWrapper<T> batchCopyUpdateByWhereMap(Map<String,Object> whereCondition, T entityObject );

    /**
     * 批量删除指定对象，把满足过滤条件的对象删除掉
     * @param whereCondition   过滤条件
     * @param objClazz   对象类型
     * @return
     */
    UpdateWrapper<T> batchDeleteByWhereMap(Map whereCondition, Class objClazz );

    String getColumnNameByFieldName(Class clazz,String fieldName) ;
    String getColumnNameByField(Class entityClass,Field fieldOne) ;
    /**
     * 获取所有的数据库列名
     * @param entityClass
     * @return
     */
    List<String> getColumnNames(Class<T> entityClass);
}
